# -*- coding: utf-8 -*-
import sys

estado=0
palabra=''
tabla=[]
simbolos=['(',')','{','}','[',']',';',',','.',':','#','\'','"']
parentesisa=['(']
parentesisc=[')']
llavea=['{']
llavec=['}']
corchetea=['[']
corchetec=[']']
puntoycoma=[';']
coma=[',']
punto=['.']
dospuntos=[':']
numeral=['#']
comillasimple=['\'']
comilladoble=['"']
numLineas = 1

def Cero(c):
	global estado
	global palabra
	if ispa(c):
		estado = 0
		palabra = c
		EdoFinal()
	
	elif ispc(c):
		estado = 0
		palabra = c
		EdoFinal()

	elif isla(c):
		estado = 0
		palabra = c
		EdoFinal()

	elif islc(c):
		estado = 0
		palabra = c
		EdoFinal()

	elif isca(c):
		estado = 0
		palabra = c
		EdoFinal()

	elif iscc(c):
		estado = 0
		palabra = c
		EdoFinal()

	elif ispyc(c):
		estado = 0
		palabra = c
		EdoFinal()

	elif isco(c):
		estado = 0
		palabra = c
		EdoFinal()

	elif ispun(c):
		estado = 0
		palabra = c
		EdoFinal()

	elif isdpun(c):
		estado = 0
		palabra = c
		EdoFinal()

	elif isnum(c):
		estado = 0
		palabra = c
		EdoFinal()

	elif issimple(c):
		estado = 0
		palabra = c
		EdoFinal()

	elif isdoble(c):
		estado = 0
		palabra = c
		EdoFinal()
	
	else:
		EdoFinal()
		Uno(c)

def EdoFinal():
	global estado
	global palabra
	global simbolos
	if palabra in simbolos:
		print 'op => ',
		print palabra
		to = tipo_op(palabra)
		tabla.append(["SIMBOLO ESPECIAL",palabra,to])
	estado=0
	palabra=''

def Uno(c):
	print "...De esto se encarga el siguiente autómata: " + c

def tipo_op(top):
	if top in parentesisa:
		return "PARÉNTESIS-ABIERTO"
	if top in parentesisc:
		return "PARÉNTESIS-CERRADO"
	if top in llavea:
		return "LLAVE-ABIERTA"
	if top in llavec:
		return "LLAVE-CERRADA"
	if top in corchetea:
		return "CORCHETE-ABIERTO"
	if top in corchetec:
		return "CORCHETE-CERRADO"
	if top in puntoycoma:
		return "PUNTO-Y-COMA"
	if top in coma:
		return "COMA"
	if top in punto:
		return "PUNTO"
	if top in dospuntos:
		return "DOS-PUNTOS"
	if top in numeral:
		return "NUMERAL"
	if top in comillasimple:
		return "COMILLA-SIMPLE"
	if top in comilladoble:
		return "COMILLA-DOBLE"

def ispa(c):
	if c=='(':
		return True
	else:
		return False

def ispc(c):
	if c==')':
		return True
	else:
		return False

def isla(c):
	if c=='{':
		return True
	else:
		return False

def islc(c):
	if c=='}':
		return True
	else:
		return False

def isca(c):
	if c=='[':
		return True
	else:
		return False

def iscc(c):
	if c==']':
		return True
	else:
		return False

def ispyc(c):
	if c==';':
		return True
	else:
		return False

def isco(c):
	if c==',':
		return True
	else:
		return False

def ispun(c):
	if c=='.':
		return True
	else:
		return False

def isdpun(c):
	if c==':':
		return True
	else:
		return False

def isnum(c):
	if c=='#':
		return True
	else:
		return False

def issimple(c):
	if c=='\'':
		return True
	else:
		return False

def isdoble(c):
	if c=='"':
		return True
	else:
		return False

def main():
	global palabra
	global tabla
	global estado
	global numLineas

	archivo_entrada = open(sys.argv[1])
	tabla_simbolos = open(sys.argv[2],'w')
	archivo_errores = open(sys.argv[3],'w')

	Switch={
		0:Cero,
		1:Uno,
	}

	while 1:
	    char = archivo_entrada.read(1)          # read by character
	    if not char: 
	    	break
	    #print 'ch: ' + char
	    #Switch[estado](char)
	    ####codigo####
	    if char==' ' or char=='\r' or char=='\n':
	    	#print "ERR: " + char
	    	if palabra!='':
	    		EdoFinal()
	    		print "EDO FINAL"
	    	palabra=''
	    	estado=0
	    	if char=='\n':
	    		numLineas += 1
	    	continue
	    else:
	    	print 'ch: ' + char
	    	print 'edo: ' + str(estado)
	    	Switch[estado](char)
    	####codigo####
    	
    	###########################################

	for p in tabla:
		tabla_simbolos.write(p[0] + '\t' + p[1] + '\t' + p[2] + '\r\n')

	archivo_entrada.close()
	tabla_simbolos.close()
	archivo_errores.close()

	print "numLineas: " + str(numLineas)

if __name__=="__main__":
	main()
